home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / util / rexx / DSMiscRexxVol3.lha / DSMiscRexxVol3 / NewBarGraph.dsrx < prev    next >
Text File  |  1997-09-12  |  13KB  |  532 lines

  1. /* Allow commands to return results */
  2.  
  3. options results
  4.  
  5. /* On error, goto ERROR:. Comment out this line if you wish to */
  6. /* perform your own error checking. */
  7.  
  8. signal on error
  9.  
  10. 'PROJECT_LOCK'
  11.  
  12. /* BEGIN PROGRAM *************************************************/
  13.  
  14. /* +++++++++++++++++++++++++++++++++++++++ */
  15. /* +                                     + */
  16. /* + Histogram drawing ARexx script V2.0 + */
  17. /* +                                     + */
  18. /* +        Written by Andrew Elia       + */
  19. /* +                                     + */
  20. /* +++++++++++++++++++++++++++++++++++++++ */
  21.  
  22. PTCNV = 28.346                /* *CONSTANT!* Converts points to Centimetres */
  23.  
  24. DATAFILE = "Dh0:T/DSMiscRexxVol3/BarDataFile"    /* Full path of data file */
  25. OFFSETX = 4.0                    /* Distance between left edge of graph and the page */
  26. OFFSETY = 3.0                    /* Distance between the top edge of graph and the page */
  27. FITSIZEX = 15                    /* Width of graph */
  28. FITSIZEY = 15                    /* Height of graph */
  29. LINEGAPX = 0.5                    /* Horizontal distance between axis line and bars */
  30. LINEGAPY = 0.5                    /* Vertical distance between axis line and bars */
  31. TICKSIZEX = 0.5                    /* Height of horizontal ticks */
  32. TICKSIZEY = 0.5                    /* Length of vertical ticks */
  33. LABELGAPX = 0.5                    /* Distance between X axis labels and tick */
  34. LABELGAPY = 0.5                    /* Distance between Y axis labels and tick */
  35. TITLEGAPX = 0.5                    /* Distance between X axis title and labels */
  36. TITLEGAPY = 0.5                    /* Distance between Y axis title and labels */
  37. YGRID = 1                        /* Display grid on Y axis (turn off with 0) */
  38. XGRID = 1                        /* Display grid on X axis (turn off with 0) */
  39. FRONTGRID = 0                    /* Grid in front/behind bars (0 = Back / 1 = Front) */
  40. COMPOUNDBARS = 1                /* Makes bars into a compound object (0 = Normal / 1 = Compound) */
  41. GAP = 0.2                        /* Inter - bar gap */
  42.  
  43. STDEV = 100                        /* Standard Deviation (set to 0 for no bars) */
  44. YMAXVAL = 1200                    /* Maximum whole value */
  45. LINESCALENUMY = 12                 /* Number of ticks (not including zero) */
  46. UNIT = "cm"                        /* Default measurement unit */
  47.  
  48. /* Open data file */
  49.  
  50. OK = Open('File',DATAFILE,'r')
  51. If OK = 0 Then Do
  52.     REQ_MESSAGE TEXT '"Error: Unable to open data file"' '"Cancel"'
  53.     PROJECT_UNLOCK
  54.     Exit
  55. End
  56.  
  57. /* Read in X and Y axis labels */
  58.  
  59. INPUT = readln('File')
  60. GETIT = Index(INPUT,',')
  61. GETLEN = Length(INPUT)
  62. If GETIT ~= 0 Then Do
  63.     XAXISLABEL = Left(INPUT,GETIT - 1)
  64.     YAXISLABEL = Right(INPUT,GETLEN - GETIT)
  65. End
  66. Else Do
  67.     REQ_MESSAGE TEXT '"Error: Comma missing from data file (labels)"' '"Cancel"'
  68.     PROJECT_UNLOCK
  69.     Exit
  70. End
  71.  
  72. COUNT = 0
  73. FINISHED = 0
  74.  
  75. /* Read in data */
  76.  
  77. do while ((~eof('File')) & (Finished = 0))
  78.        INPUT = readln('File')
  79.  
  80.     IF INPUT = "" Then Do
  81.         FINISHED = 1
  82.     End
  83.     Else Do
  84.         GETIT = Index(INPUT,',')
  85.         GETLEN = Length(INPUT)
  86.         If GETIT ~= 0 Then Do
  87.             COUNT = COUNT + 1
  88.             GRAPHLABEL.COUNT = Left(INPUT,GETIT - 1)
  89.             GRAPH.COUNT = Right(INPUT,GETLEN - GETIT)
  90.         End
  91.         Else Do
  92.             REQ_MESSAGE TEXT '"Error: Comma missing from data file (data)"' '"Cancel"'
  93.             PROJECT_UNLOCK
  94.             Exit
  95.         End
  96.     End
  97. End
  98.  
  99. GSIZE = COUNT
  100.  
  101. Call Close('File')
  102.  
  103. /* Note: The way I've implemented the OFFSETX & Y handling, it's more */
  104. /* correct to say that the offset is relative to the actual bars and not */
  105. /* the whole graph. Therefore, OFFSETX represents the distance between */
  106. /* the top of the tallest bar and the top of the page */
  107.  
  108. /* Search for maximum and minimum values */
  109.  
  110. MAXVALUE = GRAPH.1
  111. MINVALUE = GRAPH.1
  112. Do N = 1 To GSIZE
  113.     GV = GRAPH.N
  114.     If GV > MAXVALUE Then MAXVALUE = GV
  115.     If GV < MINVALUE Then MINVALUE = GV
  116. End N
  117.  
  118. /* MINVALUE now holds the smallest value, and MAXVALUE the largest */
  119.  
  120. /* This bit works out the scale for each bar so that it will fit the */
  121. /* sizes specified above (FITSIZEX & Y) */
  122.  
  123. SCALEY = FITSIZEY/MAXVALUE
  124. SCALEX = (FITSIZEX - (GAP * (GSIZE - 1)))/GSIZE
  125.  
  126. /* This bit works out the distance between each vertical tick  according */
  127. /* to the scale specified by YMAXVAL, and the number of ticks specified */
  128. /* by LINESCALENUMY. It also sets up the starting point for the first */
  129. /* tick (COUNTICK) */
  130.  
  131. LINESCALEY = (YMAXVAL * SCALEY)/LINESCALENUMY
  132. COUNTICK = OFFSETX + LINEGAPX
  133.  
  134. XTICKNUM = 0
  135. XTEXTNUM = 0
  136. YGRIDNUM = 0
  137.  
  138. /* Draws the ticks along the X axis */
  139.  
  140. REDRAW_OFF
  141.  
  142. Y1 = OFFSETY + FITSIZEY + LINEGAPY
  143. Y2 = OFFSETY + FITSIZEY + LINEGAPY + TICKSIZEY
  144. Y3 = Y2 + LABELGAPX
  145. Y4 = OFFSETY + FITSIZEY - ((LINESCALENUMY + 1) * LINESCALEY)
  146.  
  147. Do N = 1 To GSIZE
  148.     X1 = COUNTICK + (SCALEX/2)
  149.     X2 = X1
  150.     CREATE_LINE X1||UNIT||" "||Y1||UNIT||" "||X2||UNIT||" "||Y2||UNIT
  151.     XTICKNAMES.XTICKNUM = RESULT
  152.     XTICKNUM = XTICKNUM + 1
  153.  
  154.     If YGRID = 1 Then Do
  155.         CREATE_LINE X1||UNIT||" "||Y1||UNIT||" "||X2||UNIT||" "||Y4||UNIT
  156.         YGRIDNAMES.YGRIDNUM = RESULT
  157.         YGRIDNUM = YGRIDNUM + 1
  158.     End
  159.  
  160.     OBJECT_DESELECT
  161.  
  162.     'CREATE_TEXT '||X1||UNIT||' '||Y3||UNIT||' "'||GRAPHLABEL.N||'"'
  163.     XTEXTNAMES.XTEXTNUM = RESULT
  164.     XTEXTNUM = XTEXTNUM + 1
  165.  
  166.     ATTRS_TEXT_SET FONT "Rocket" SIZE "24"
  167.  
  168.     OBJECT_ROTATE ANGLE "270"
  169.  
  170.     OBJECT_SPECS_GET STEM 'OBJSPECS.'
  171.  
  172.     DIFX = X1 - (OBJSPECS.LEFT / PTCNV)
  173.     DIFX = DIFX + (((OBJSPECS.WIDTH / 2) / PTCNV) * -1)
  174.     'OBJECT_MOVE X '||DIFX||UNIT
  175.  
  176.     COUNTICK = COUNTICK + SCALEX + GAP
  177. End N
  178.  
  179. /* Groups gridlines together */
  180.  
  181. If YGRID = 1 Then Do
  182.     OBJECT_DESELECT
  183.     Do N = 0 To YGRIDNUM - 1
  184.         OBJECT_SELECT YGRIDNAMES.N
  185.     End
  186.     OBJECT_GROUP
  187.     YGRIDOBJECT = RESULT
  188. End
  189.  
  190. /* Aligns and groups labels together */
  191.  
  192. OBJECT_DESELECT
  193. Do N = 0 To XTEXTNUM - 1
  194.     OBJECT_SELECT XTEXTNAMES.N
  195. End
  196. OBJECT_ALIGN ALIGN_Y TOP
  197. OBJECT_GROUP
  198. OBJECT_SPECS_GET STEM 'OBJSPECS.'
  199. DIFY = Y3 - (OBJSPECS.TOP / PTCNV)
  200. 'OBJECT_MOVE Y '||DIFY||UNIT
  201. OBJECT_SPECS_GET STEM 'OBJSPECS.'
  202. LABELSBOTTOM = (OBJSPECS.BOTTOM / PTCNV) + TITLEGAPX
  203.  
  204. 'CREATE_TEXT '||X1||UNIT||' '||Y3||UNIT||' "'||XAXISLABEL||'"'
  205. OBJECT_SPECS_GET STEM 'OBJSPECS.'
  206. DIFX = (OFFSETX + LINEGAPX) - (OBJSPECS.LEFT / PTCNV) + (((FITSIZEX + LINEGAPX) - (OBJSPECS.WIDTH / PTCNV)) / 2)
  207. DIFY = LABELSBOTTOM - (OBJSPECS.TOP / PTCNV)
  208. 'OBJECT_MOVE X '||DIFX||UNIT||' Y '||DIFY||UNIT
  209.  
  210. REDRAW_ON
  211.  
  212. /* Draws the ticks along the Y axis */
  213.  
  214. REDRAW_OFF
  215.  
  216. YTICKNUM = 0
  217. YTEXTNUM = 0
  218. XGRIDNUM = 0
  219.  
  220. OBJECT_DESELECT
  221.  
  222. AXISTEXTSCALE = YMAXVAL / LINESCALENUMY
  223.  
  224. X1 = OFFSETX - LINEGAPX
  225. X2 = OFFSETX + TICKSIZEX - LINEGAPX
  226. X3 = X1 - LABELGAPY
  227. X4 = OFFSETX + FITSIZEX + LINEGAPX
  228.  
  229. COUNTICK = OFFSETY + FITSIZEY
  230. Do N = 0 To LINESCALENUMY
  231.     REDRAW_OFF
  232.     Y1 = COUNTICK
  233.     Y2 = Y1
  234.     CREATE_LINE X1||UNIT||" "||Y1||UNIT||" "||X2||UNIT||" "||Y2||UNIT
  235.     YTICKNAMES.YTICKNUM = RESULT
  236.     YTICKNUM = YTICKNUM + 1
  237.  
  238.     If XGRID = 1 Then Do
  239.         CREATE_LINE X2||UNIT||" "||Y1||UNIT||" "||X4||UNIT||" "||Y2||UNIT
  240.         XGRIDNAMES.XGRIDNUM = RESULT
  241.         XGRIDNUM = XGRIDNUM + 1
  242.     End
  243.  
  244.     OBJECT_DESELECT
  245.  
  246.     YVTXT = AXISTEXTSCALE * N
  247.  
  248.     'CREATE_TEXT '||X3||UNIT||' '||Y1||UNIT||' "'||YVTXT||'"'
  249.     YTEXTNAMES.YTEXTNUM = RESULT
  250.     YTEXTNUM = YTEXTNUM + 1
  251.  
  252.     OBJECT_SPECS_GET STEM 'OBJSPECS.'
  253.  
  254.     DIFY = Y1 - (OBJSPECS.TOP / PTCNV)
  255.     DIFY = DIFY + (((OBJSPECS.HEIGHT / 2) / PTCNV) * -1)
  256.  
  257.     'OBJECT_MOVE Y '||DIFY||UNIT
  258.  
  259.     COUNTICK = COUNTICK - LINESCALEY
  260. End N
  261.  
  262. /* Groups gridlines together */
  263. If XGRID = 1 Then Do
  264.     OBJECT_DESELECT
  265.     Do N = 0 To XGRIDNUM - 1
  266.         OBJECT_SELECT XGRIDNAMES.N
  267.     End
  268.     OBJECT_GROUP
  269.     XGRIDOBJECT = RESULT
  270. End
  271.  
  272. OBJECT_DESELECT
  273. If YGRID = 1 Then Do
  274.     OBJECT_SELECT YGRIDOBJECT
  275.     GRIDOBJECT = RESULT
  276. End
  277. If XGRID = 1 Then Do
  278.     OBJECT_SELECT XGRIDOBJECT
  279.     GRIDOBJECT = RESULT
  280. End
  281. If (XGRID = 1) & (YGRID = 1) Then Do
  282.     OBJECT_GROUP
  283.     GRIDOBJECT = RESULT
  284. End
  285.  
  286. /* Aligns and groups values together */
  287.  
  288. OBJECT_DESELECT
  289. Do N = 0 To YTEXTNUM - 1
  290.     OBJECT_SELECT YTEXTNAMES.N
  291. End
  292. OBJECT_ALIGN ALIGN_X RIGHT
  293. OBJECT_GROUP
  294. OBJECT_SPECS_GET STEM 'OBJSPECS.'
  295. DIFX = X3 - (OBJSPECS.RIGHT / PTCNV)
  296. 'OBJECT_MOVE X '||DIFX||UNIT
  297.  
  298. OBJECT_SPECS_GET STEM 'OBJSPECS.'
  299. LABELSSIDE = (OBJSPECS.LEFT / PTCNV) - TITLEGAPY
  300.  
  301. OBJECT_DESELECT
  302.  
  303. 'CREATE_TEXT '||X1||UNIT||' '||Y3||UNIT||' "'||YAXISLABEL||'"'
  304. OBJECT_ROTATE ANGLE "270"
  305. OBJECT_ALIGN TOPAGE ALIGN_X LEFT ALIGN_Y TOP
  306. OBJECT_SPECS_GET STEM 'OBJSPECS.'
  307.  
  308. DIFX = LABELSSIDE - (OBJSPECS.RIGHT / PTCNV)
  309. DIFY = (OFFSETY + FITSIZEY - ((LINESCALENUMY + 1) * LINESCALEY)) - (OBJSPECS.TOP / PTCNV)
  310. DIFY = DIFY + (((LINEGAPY + ((LINESCALENUMY + 1) * LINESCALEY)) - (OBJSPECS.HEIGHT / PTCNV)) / 2)
  311.  
  312. 'OBJECT_MOVE X '||DIFX||UNIT||' Y '||DIFY||UNIT
  313.  
  314. REDRAW_ON
  315.  
  316. /* Draws the horizontal and vertical axis lines */
  317.  
  318. REDRAW_OFF
  319.  
  320. X1 = OFFSETX
  321. X2 = OFFSETX + FITSIZEX + LINEGAPX
  322. Y1 = OFFSETY + FITSIZEY - ((LINESCALENUMY + 1) * LINESCALEY)
  323. Y2 = OFFSETY + LINEGAPY + FITSIZEY
  324. CREATE_BEZIER X1||UNIT||" "||Y1||UNIT||" L "||X1||UNIT||" "||Y2||UNIT||" L "||X2||UNIT||" "||Y2||UNIT
  325. AXISNAME = RESULT
  326.  
  327. /* Groups axis and ticks together */
  328.  
  329. OBJECT_DESELECT
  330. OBJECT_SELECT AXISNAME
  331. Do N = 0 To XTICKNUM - 1
  332.     OBJECT_SELECT XTICKNAMES.N
  333. End
  334.  
  335. Do N = 0 To YTICKNUM - 1
  336.     OBJECT_SELECT YTICKNAMES.N
  337. End
  338. OBJECT_GROUP
  339. BOTHAXISNAME = RESULT
  340.  
  341. ATTRS_PENSTYLE_SET START "None" END "None" JOIN "Round" THICKNESS "1mm"
  342. ATTRS_PENCOLOUR_SET 0 0 0 0
  343. ATTRS_PENFILL_SET "Solid" "Black"
  344. ATTRS_FILLFILL_SET "None" "Black"
  345.  
  346. OBJECT_TOFRONT
  347.  
  348. OFFSETX = OFFSETX + LINEGAPX
  349.  
  350. REDRAW_ON
  351.  
  352. /* Draws the actual bars */
  353. /* Also checks that if the size of the bar is zero -don't bother */
  354. /* drawing it. This bit can always be taken out if you want a very */
  355. /* small line to be drawn instead */
  356.  
  357. REDRAW_OFF
  358.  
  359. BARNUM = 0
  360. EBARNUM = 0
  361.  
  362. COUNTBAR = OFFSETX
  363. Do N = 1 To GSIZE
  364.     X1 = COUNTBAR
  365.     X2 = COUNTBAR + SCALEX
  366.     Y1 = OFFSETY + ((MAXVALUE * SCALEY) - (GRAPH.N * SCALEY))
  367.     Y2 = OFFSETY + (MAXVALUE * SCALEY)
  368.  
  369.     If (Y1 - Y2) ~= 0 Then Do
  370.         OBJECT_DESELECT
  371.         CREATE_RECT X1||UNIT||" "||Y1||UNIT||" "||X2||UNIT||" "||Y2||UNIT
  372.         BARNAMES.BARNUM = RESULT
  373.         BARNUM = BARNUM + 1
  374.         ATTRS_PENSTYLE_SET START "None" END "None" JOIN "Round" THICKNESS "1mm"
  375.         ATTRS_PENCOLOUR_SET 0 0 0 0
  376.         ATTRS_PENFILL_SET "Solid" "Black"
  377.         ATTRS_FILLFILL_SET "Solid" '"Pure Red"'
  378.         ATTRS_FILLCOLOUR_SET 255 0 0 255
  379.  
  380.         If STDEV ~= 0 Then Do
  381.             Y3 = OFFSETY + ((MAXVALUE * SCALEY) - ((GRAPH.N + STDEV) * SCALEY))
  382.             CREATE_LINE X1||UNIT||" "||Y3||UNIT||" "||X2||UNIT||" "||Y3||UNIT
  383.             LB1 = RESULT
  384.             Y4 = OFFSETY + ((MAXVALUE * SCALEY) - ((GRAPH.N - STDEV) * SCALEY))
  385.             CREATE_LINE X1||UNIT||" "||Y4||UNIT||" "||X2||UNIT||" "||Y4||UNIT
  386.             LB2 = RESULT
  387.             X3 = X1 + ((X2 - X1) / 2)
  388.             CREATE_LINE X3||UNIT||" "||Y3||UNIT||" "||X3||UNIT||" "||Y4||UNIT
  389.             LB3 = RESULT
  390.             OBJECT_DESELECT
  391.             OBJECT_SELECT LB1
  392.             OBJECT_SELECT LB3
  393.             OBJECT_JOIN
  394.             OBJECT_SELECT LB2
  395.             OBJECT_JOIN
  396.             OBJECT_SPECS_GET STEM 'OBJSPECS.'
  397.             XP = OBJSPECS.LEFT / PTCNV
  398.             YP = OBJSPECS.TOP / PTCNV
  399.             CUT
  400.             PASTE XP YP
  401.             OBJECT_SPECS_GET STEM 'OBJSPECS.'
  402.             EBARNAME.EBARNUM = OBJSPECS.NAME
  403.             EBARNUM = EBARNUM + 1
  404.             ATTRS_PENSTYLE_SET START "None" END "None" JOIN "Round" THICKNESS "1mm"
  405.             ATTRS_PENCOLOUR_SET 0 0 0 0
  406.             ATTRS_PENFILL_SET "Solid" "Black"
  407.             ATTRS_FILLFILL_SET "None" "Black"
  408.         End
  409.     End
  410.  
  411.     COUNTBAR = COUNTBAR + SCALEX + GAP
  412. End N
  413.  
  414. /* Selects all the bars */
  415.  
  416. OBJECT_DESELECT
  417. Do N = 0 To BARNUM - 1
  418.     OBJECT_SELECT BARNAMES.N
  419. End
  420.  
  421. ATTRS_PENSTYLE_SET START "None" END "None" JOIN "Round" THICKNESS "1mm"
  422. ATTRS_PENCOLOUR_SET 0 0 0 0
  423. ATTRS_PENFILL_SET "Solid" "Black"
  424. ATTRS_FILLFILL_SET "Solid" '"Pure Red"'
  425. ATTRS_FILLCOLOUR_SET 255 0 0 255
  426.  
  427. /* Makes the bars either a group object or a compound object*/
  428.  
  429. If COMPOUNDBARS = 0 Then Do
  430.     OBJECT_GROUP
  431. End
  432. Else Do
  433.     OBJECT_MAKE_COMPOUND
  434. End
  435.  
  436. OBJECT_TOBACK
  437.  
  438. If EBARNUM > 0 Then Do
  439.     OBJECT_DESELECT
  440.     Do N = 0 To EBARNUM - 1
  441.         OBJECT_SELECT EBARNAME.N
  442.     End
  443.     OBJECT_GROUP
  444.  
  445.     ATTRS_PENSTYLE_SET START "None" END "None" JOIN "Round" THICKNESS "1mm"
  446.     ATTRS_PENCOLOUR_SET 0 0 0 0
  447.     ATTRS_PENFILL_SET "Solid" "Black"
  448.     ATTRS_FILLFILL_SET "None" "Black"
  449. End
  450.  
  451. /* Puts the grid in front of or behind the bars */
  452.  
  453. OBJECT_DESELECT
  454. OBJECT_SELECT GRIDOBJECT
  455. If FRONTGRID = 0 Then Do
  456.     OBJECT_TOBACK
  457. End
  458. Else Do
  459.     OBJECT_TOFRONT
  460.     OBJECT_DESELECT
  461.     OBJECT_SELECT BOTHAXISNAME
  462.     OBJECT_TOFRONT
  463. End
  464.  
  465. /* Ta da! */
  466.  
  467. REDRAW_ON
  468.  
  469. /* END PROGRAM ***************************************************/
  470.  
  471. PROJECT_UNLOCK
  472. Exit
  473.  
  474. /* On ERROR */
  475.  
  476. ERROR:
  477.  
  478. 'PROJECT_UNLOCK'
  479.  
  480. /* If we get here, either an error occurred with the command's */
  481. /* execution or there was an error with the command itself. */
  482. /* In the former case, rc2 contains the error message and in */
  483. /* the latter, rc2 contains an error number. SIGL contains */
  484. /* the line number of the command which caused the jump */
  485. /* to ERROR: */
  486.  
  487. if datatype(rc2,'NUMERIC') == 1 then do
  488.     /* See if we can describe the error with a string */
  489.  
  490.     select
  491.         when rc2 == 103 then
  492.             err_string = "ERROR 103, "||,
  493.                 "out of memory at line "||SIGL
  494.         when rc2 == 114 then
  495.             err_string = "ERROR 114, "||,
  496.                 "bad command template at line "||SIGL
  497.         when rc2 == 115 then
  498.             err_string = "ERROR 115, "||,
  499.                 "bad number for /N argument at line "||SIGL
  500.         when rc2 == 116 then
  501.             err_string = "ERROR 116, "||,
  502.                 "required argument missing at line "||SIGL
  503.         when rc2 == 117 then
  504.             err_string = "ERROR 117, "||,
  505.                 "value after keywork missing at line "||SIGL
  506.         when rc2 == 118 then
  507.             err_string = "ERROR 118, "||,
  508.                 "wrong number of arguments at line "||SIGL
  509.         when rc2 == 119 then
  510.             err_string = "ERROR 119, "||,
  511.                 "unmatched quotes at line "||SIGL
  512.         when rc2 == 120 then
  513.             err_string = "ERROR 120, "||,
  514.                 "line too long at line "||SIGL
  515.         when rc2 == 236 then
  516.             err_string = "ERROR 236, "||,
  517.                 "unknown command at line "||SIGL
  518.         otherwise
  519.             err_string = "ERROR "||rc2||", at line "||SIGL
  520.         end
  521.     end
  522. else if rc2 == 'RC2' then do
  523.     err_string = "ERROR in command at line "||SIGL
  524.     end
  525. else do
  526.     err_string = rc2||", line "||SIGL
  527.     end
  528.  
  529. req_message TEXT '"'err_string'"'
  530.  
  531. exit
  532.